#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
Mikan 例外 パッケージ

Mikan Python Web Framework
"""

__author__ = "K.Sonohara"
__status__ = "develop"
__version__ = "0.0.0_23"
__date__    = "2013/07/07"
__license__ = 'LGPL'

# ------------------------------------------------------------
## インポート
# ------------------------------------------------------------
# Python
import locale
import traceback

# ESiPC
from esipc import ESiPCProperty
from esipc.resource.iniresource import ESiPCINIFileResourceBundle
from esipc.exception import AbstractESiPCResourceException

# Mikan
from mikan.core import AbstractMikan,MIKAN_HTTP_STATUS
from mikan.request import MikanRequest


# ------------------------------------------------------------
## 変数
# ------------------------------------------------------------
## リソース変数
RESOURCE = ESiPCINIFileResourceBundle(__file__)

# ------------------------------------------------------------
## 関数
# ------------------------------------------------------------

# ------------------------------------------------------------
## 国際化対応リソース関数
# @param key キー
# @param default 初期値
# @param locale 言語
# @param resource リソース
def _(key, default, locale=None, resource=RESOURCE):
	try:
		return resource.get_string(key, default, locale)
	except:
		return default

# ------------------------------------------------------------
## クラス
# ------------------------------------------------------------
# ------------------------------------------------------------
## Mikan 抽象例外 クラス
#
class AbstractMikanException(AbstractESiPCResourceException):

	# ----------------------------------------------------
	## ロケール 取得
	# @return 取得した値
	def get_locale(self):
		try:
			return self.request.get_locale()
		except:
			return locale.getdefaultlocale()

	# ----------------------------------------------------
	## リソース 取得
	# @return 取得した値
	def get_resource(self):
		return self.FResource

	# ----------------------------------------------------
	## コンストラクタ
	#  @param request リクエスト
	#  @param params 引数
	#  @param resource リソース
	def __init__(self, request, params=None, resource=RESOURCE):
		# 継承元処理
		super(AbstractMikanException, self).__init__(params)

		# 値の設定
		self.FRequest = request
		self.FResource = resource

	# ----------------------------------------------------
	## リクエスト フィールドゲッター
	# @return 取得した値
	def get_request(self):
		return self.FRequest

	# ----------------------------------------------------
	## Property
	locale = ESiPCProperty(get_locale, None, None)
	request = ESiPCProperty(get_request, None, None)
	resource = ESiPCProperty(get_resource, None, None)

# ------------------------------------------------------------
## Mikan 抽象例外 クラス
#
class AbstractMikanStatusException(AbstractMikanException):

	# ----------------------------------------------------
	## コンストラクタ
	#  @param request リクエスト
	#  @param status エラーコード
	#  @param request リクエスト
	#  @param params 引数
	#  @param resource リソース
	def __init__(self, request, status=500, params=None, resource=RESOURCE):
		# 継承元処理
		super(AbstractMikanStatusException, self).__init__(request, params, resource)

		# 値の設定
		self.FStatus = status

	# ----------------------------------------------------
	## HTTPコード 取得
	# @return 取得した値
	def get_status(self):
		return self.FStatus

	# ----------------------------------------------------
	## HTTPコード メッセージ 取得
	# @return 取得した値
	def get_status_message(self):
		try:
			s = self.resource.get_string(str(self.status), str(self.status), self.locale)
			if (s != None):
				return s
		except:
			print(traceback.format_exc())
			pass
		return str(self.status)

	# ----------------------------------------------------
	## メッセージ 取得
	# @return 取得した値
	def get_message(self):
		# 継承元処理
		message = super(AbstractMikanStatusException, self).get_message()
		if message and message != self.__class__.__name__:
			return message
		return self.statusmessage

	# ----------------------------------------------------
	## Property
	status = ESiPCProperty(get_status, None, None)
	message = ESiPCProperty(get_message, None, None)
	statusmessage = ESiPCProperty(get_status_message, None, None)

# ------------------------------------------------------------
## Mikan 例外 クラス
#
class MikanStatusException(AbstractMikanStatusException):

	# ----------------------------------------------------
	## コンストラクタ
	#  @param request リクエスト
	#  @param status エラーコード
	def __init__(self, request, status=MIKAN_HTTP_STATUS.STATUS_INTERNAL_SERVER_ERROR):
		# 継承元処理
		super(MikanStatusException, self).__init__(request, status)

# ------------------------------------------------------------
## Mikan 例外 クラス
#
class MikanSendRedirectException(AbstractMikanStatusException):
	def get_url(self):
		return self.FURL

	# ----------------------------------------------------
	## コンストラクタ
	#  @param request リクエスト
	#  @param url URL
	def __init__(self, request, url):
		# 継承元処理
		super(MikanSendRedirectException, self).__init__(request, MIKAN_HTTP_STATUS.STATUS_MOVEDPERMANENTLY)

		self.FURL = url

	# ----------------------------------------------------
	## Property
	url = ESiPCProperty(get_url, None, None)

# ------------------------------------------------------------
## Mikan 例外リスト クラス
#
class MikanExceptions(AbstractMikanStatusException):

	# ----------------------------------------------------
	## 例外 フィールドゲッター
	# @return 取得した値
	def get_exceptions(self):
		return self.FExceptions

	# ----------------------------------------------------
	## コンストラクタ
	#  @param request リクエスト
	#  @param status エラーコード
	#  @param exceptions 例外
	def __init__(self, request, status=500, exceptions=None):
		# 継承元処理
		super(MikanExceptions, self).__init__(request, status, "")

		# 値の設定
		if exceptions:
			self.FExceptions = exceptions
		else:
			self.FExceptions = []

	# ----------------------------------------------------
	## Property
	exceptions = ESiPCProperty(get_exceptions, None, None)

# ------------------------------------------------------------
## メイン関数
# ------------------------------------------------------------
if __name__ == '__main__':
	pass

# ------------------------------------------------------------
